/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package chequeTeatinos.beans;

import chequeTeatinos.ejb.OfertaFacade;
import chequeTeatinos.ejb.PedidoFacade;
import chequeTeatinos.ejb.PedidoOfertaFacade;
import chequeTeatinos.entities.Oferta;
import chequeTeatinos.entities.Pedido;
import chequeTeatinos.entities.PedidoOferta;
import chequeTeatinos.utils.OfertaCart;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

@ManagedBean
@SessionScoped
public class CartBean implements Serializable{

    @EJB
    private OfertaFacade ofertaFacade;

    @EJB
    private PedidoFacade pedidoFacade;
    
    @EJB
    private PedidoOfertaFacade pedidoofertaFacade;
    
    private List<Oferta> ofertasPrint;
    private List<OfertaCart> ofertasCart;
    private double preciototal;

    /**
     * @return 
     */
    private int idnuevoPedido(){
        int idnueva = 0;
        List<Pedido> o = pedidoFacade.findAll();
        
        for(int i=0; i<o.size(); i++){
            if(idnueva < o.get(i).getCodigoPedido())
                idnueva = o.get(i).getCodigoPedido();
        }
        
        return idnueva+1;
    }
    
    /**
     * @return 
     */
    private int idnuevoPedidoOferta(){
        int idnueva = 0;
        List<PedidoOferta> o = pedidoofertaFacade.findAll();
        
        for(int i=0; i<o.size(); i++){
            if(idnueva < o.get(i).getId())
                idnueva = o.get(i).getId();
        }
        
        return idnueva+1;
    }    
    
    
    
    public CartBean() {
        preciototal = 0;
        ofertasCart =  new ArrayList<>();
    }

    public List<Oferta> getOfertasPrint() {
        return ofertasPrint;
    }

    public void setOfertasPrint(List<Oferta> ofertasPrint) {
        this.ofertasPrint = ofertasPrint;
    }

    public List<OfertaCart> getOfertasCart() {
        return ofertasCart;
    }

    public void setOfertasCart(List<OfertaCart> ofertasCart) {
        this.ofertasCart = ofertasCart;
    }

    public double getPreciototal() {
        return preciototal;
    }

    public void setPreciototal(double preciototal) {
        this.preciototal = preciototal;
    }
    
    public String addOffertoCart(){
        OfertasBean offer = (OfertasBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("ofertasBean");   
        
        int yaencarrito = -1;
        for(int i=0; i<ofertasCart.size();i++){
            if(ofertasCart.get(i).getId() == offer.getSelectedOffer().getId()){
                yaencarrito = i;
                
            }
        }
        
        if(yaencarrito == -1){
            OfertaCart of = new OfertaCart(offer.getSelectedOffer().getId(), offer.getSelectedOffer().getNombreOferta(), offer.getSelectedOffer().getPrecioConOferta(), offer.getSelectedOffer().getEmpresa().getNombre(), 1, offer.getSelectedOffer().getPrecioConOferta().doubleValue());
            ofertasCart.add(of);
        }
        else{
            ofertasCart.get(yaencarrito).addUnidades();
        }
        
        preciototal += offer.getSelectedOffer().getPrecioConOferta().doubleValue();
        return "cart.jsf";
    }
    
    public void logeo(ActionEvent actionEvent){
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "System Error",  "Please try again later.");
            FacesContext.getCurrentInstance().addMessage(null, message);
    }
    
    public String payfinish(){
        /** Resta el número de existencias de todas las ofertas compradas **/
        for(int i=0; i<ofertasCart.size(); i++){
            int existencias = ofertaFacade.find(ofertasCart.get(i).getId()).getExistencias().intValue()- ofertasCart.get(i).getUnidades();
            System.out.println("Oferta: "+ofertasCart.get(i).getNombre()+ " existencias: "+existencias+" unidades: "+ofertasCart.get(i).getUnidades());
            Oferta o = ofertaFacade.find(ofertasCart.get(i).getId());
            o.setExistencias((short) existencias);
            ofertaFacade.edit(o);
        }
        
        
        /** Añadir a pedido **/
        Pedido p = new Pedido();
        p.setCodigoPedido(idnuevoPedido());
        
        /* Recupera cliente de sesión */
        LoginBean cli = (LoginBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginBean");
        p.setEmail(cli.getCli());
        
        p.setFecha(new Date());
        p.setTotal(BigDecimal.valueOf(preciototal));
        pedidoFacade.create(p);
        
        ofertasPrint = new ArrayList<>();
        
        for(int i=0; i<ofertasCart.size(); i++){//Por todas las ofertas de carrito se las añade al pedido
            for(int j=0; j<ofertasCart.get(i).getUnidades(); j++){
                PedidoOferta po = new PedidoOferta();
                po.setId(idnuevoPedidoOferta());
                po.setCodigoPedido(p);
                po.setCodigoOferta(ofertaFacade.find(ofertasCart.get(i).getId()));
                
                ofertasPrint.add(ofertaFacade.find(ofertasCart.get(i).getId()));
                pedidoofertaFacade.create(po);
            }
        }
        
        
        /** Se vacía sesión **/
        preciototal = 0;
        ofertasCart =  new ArrayList<>();

        return "finish.jsf";
    }
    
    public void vaciarCarrito(){
        ofertasCart.clear();
        preciototal = 0;
    }
    
    public String deleteOffer (OfertaCart o){
        ofertasCart.remove(o);
        preciototal -= (o.getPrecio().doubleValue() * o.getUnidades());
        return "cart.jsf?faces-redirect=true";
    }
}
